package com.util;

/**
 * Created by wlc on 2018/1/12.
 */
import java.io.*;
import java.util.ArrayList;

public class FileUtil {
    /**
     * 创建不存在的文件
     * @param destFileName
     * @return
     */
    public static boolean createFile(String destFileName) {
        File file = new File(destFileName);
        if(file.exists()) {
            System.out.println("创建单个文件" + destFileName + "失败，目标文件已存在！");
            return false;
        }
        if (destFileName.endsWith(File.separator)) {
            System.out.println("创建单个文件" + destFileName + "失败，目标文件不能为目录！");
            return false;
        }
        //判断目标文件所在的目录是否存在
        if(!file.getParentFile().exists()) {
            //如果目标文件所在的目录不存在，则创建父目录
            System.out.println("目标文件所在目录不存在，准备创建它！");
            if(!file.getParentFile().mkdirs()) {
                System.out.println("创建目标文件所在目录失败！");
                return false;
            }
        }
        //创建目标文件
        try {
            if (file.createNewFile()) {
                System.out.println("创建单个文件" + destFileName + "成功！");
                return true;
            } else {
                System.out.println("创建单个文件" + destFileName + "失败！");
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("创建单个文件" + destFileName + "失败！" + e.getMessage());
            return false;
        }
    }

    public static String createTempFile(String prefix, String suffix, String dirName) {
        File tempFile = null;
        if (dirName == null) {
            try{
                //在默认文件夹下创建临时文件
                tempFile = File.createTempFile(prefix, suffix);
                //返回临时文件的路径
                return tempFile.getCanonicalPath();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("创建临时文件失败！" + e.getMessage());
                return null;
            }
        } else {
            File dir = new File(dirName);
            //如果临时文件所在目录不存在，首先创建
            if (!dir.exists()) {
                if (!FileUtil.createDir(dirName)) {
                    System.out.println("创建临时文件失败，不能创建临时文件所在的目录！");
                    return null;
                }
            }
            try {
                //在指定目录下创建临时文件
                tempFile = File.createTempFile(prefix, suffix, dir);
                return tempFile.getCanonicalPath();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("创建临时文件失败！" + e.getMessage());
                return null;
            }
        }
    }

    private static boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) {
            System.out.println("创建目录" + destDirName + "失败，目标目录已经存在");
            return false;
        }
        if (!destDirName.endsWith(File.separator)) {
            destDirName = destDirName + File.separator;
        }
        //创建目录
        if (dir.mkdirs()) {
            System.out.println("创建目录" + destDirName + "成功！");
            return true;
        } else {
            System.out.println("创建目录" + destDirName + "失败！");
            return false;
        }
    }

    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     * @return boolean Returns "true" if all deletions were successful.
     *                 If a deletion fails, the method stops attempting to
     *                 delete and returns "false".
     */
    public static boolean deleteDir(File dir){
        if (dir.isDirectory()) {
            String[] children = dir.list();
//         递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空，可以删除
        return dir.delete();
    }

    /**
     * 从指定文件读取文件内容
     * @param destFileName
     * @return
     * @throws IOException
     */
    public static ArrayList<String> readFile(String destFileName) throws IOException{
        InputStreamReader in = new InputStreamReader(new FileInputStream(destFileName),"UTF-8");
        BufferedReader br = new BufferedReader(in);
        ArrayList<String> content = new ArrayList<>();
        String temp;
        while((temp=br.readLine())!=null){  //按行读取文件内容
            content.add(temp);
        }
        br.close();
        return content;
    }

    /**
     * 向指定文件中写入内容（覆盖写）
     * @param destFileName
     * @param content
     * @throws IOException
     */
    public static void writeFile(String destFileName,ArrayList<String> content) throws IOException{
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(destFileName),"UTF-8");
        BufferedWriter bw = new BufferedWriter(out);
        for (String row_content : content){
            bw.write(row_content);
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }

    /**
     * 列出当前文件系统中的根目录
     * @return 数组
     */
    public static ArrayList<String> listRootDir(){
        ArrayList<String> rootDir = new ArrayList<>();
        File[] roots = File.listRoots();
        for(File root :roots) {
            rootDir.add(root.toString());
        }
        return rootDir;
    }

    /**
     * 列出指定目录下所有非隐藏[文件组，是否是目录]
     * @param dirPath
     * @return ArrayList<String>
     */
    public static ArrayList<ArrayList<String>> listNonHideFiles(String dirPath){
        File file = new File(dirPath);
        ArrayList<ArrayList<String>> fileArray = new ArrayList<>();
        ArrayList<String> nonHideFile = new ArrayList<>();
        ArrayList<String> dirIs = new ArrayList<>();
        if (file.isDirectory()) {
            File[] fileList = file.listFiles();
            for (File file1 : fileList){
                if (!file1.isHidden()){
                    nonHideFile.add(file1.getName());
                    if (file1.isDirectory()){
                        dirIs.add("1");
                    }else {
                        dirIs.add("0");
                    }
                }
            }
            fileArray.add(nonHideFile);
            fileArray.add(dirIs);
        }
        return fileArray;
    }
}